package helpers;

import models.Afiche;
import models.Backlight;
import models.Banner;
import models.Calidad;
import models.Display;
import models.EspecificacionPortaBanner;
import models.EspecificacionTerminacion;
import models.Impresion;
import models.Laminado;
import models.MaterialImprimible;
import models.MaterialLaminado;
import models.MaterialMontaje;
import models.Montaje;
import models.PortaBanner;
import models.Poster;
import models.Producto;
import models.Terminacion;
import models.TipoProducto;
import models.Vinilo;

import org.modelmapper.ModelMapper;

import datatransfer.ProductoDTO;

public class ProductoHelper {
	
	public static ProductoDTO convert(Producto producto){
    	ModelMapper modelMapper = new ModelMapper();
    	ProductoDTO productoDTO = modelMapper.map(producto, ProductoDTO.class);
    	productoDTO.calidadId= producto.calidad.id;
    	productoDTO.impresionId= ((Impresion)producto.impresion).materialImpresion.id;
    	productoDTO.impresion=((Impresion)producto.impresion).materialImpresion.nombre;
    	productoDTO.calidad=producto.calidad.nombre;
    	productoDTO.terminacionId = (long) -1;
    	productoDTO.portaBannerId = (long) -1;
    	productoDTO.montajeId = (long) -1;
    	productoDTO.laminadoId = (long) -1;
    	
    	if(producto instanceof Afiche){
    		productoDTO.tipo=TipoProducto.AFICHE.getValue();
    	}
    	else if(producto instanceof Backlight){
    		if(((Backlight)producto).terminacion != null)
    			productoDTO.terminacionId = ((Backlight)producto).terminacion.especificacionTerminacion.id;
    	
    		productoDTO.tipo=TipoProducto.BACKLIGHT.getValue();
    	}
    	else if(producto instanceof Banner){
    		if(((Banner)producto).terminacion != null)
    			productoDTO.terminacionId = ((Banner)producto).terminacion.especificacionTerminacion.id;
    		
    		if(((Banner)producto).portaBanner != null)
    			productoDTO.portaBannerId = ((Banner)producto).portaBanner.especificacionPortaBanner.id;
    		
    		productoDTO.tipo=TipoProducto.BANNER.getValue();
    	}
    	else if(producto instanceof Display){
    		if(((Display)producto).terminacion != null)
    			productoDTO.terminacionId = ((Display)producto).terminacion.especificacionTerminacion.id;
    		if(((Display)producto).montaje != null)
    			productoDTO.montajeId = ((Display)producto).montaje.materialMontaje.id;
    		productoDTO.tipo=TipoProducto.DISPLAY.getValue();
    	}
    	else if(producto instanceof Poster){
    		if(((Poster)producto).terminacion != null)
    			productoDTO.terminacionId = ((Poster)producto).terminacion.especificacionTerminacion.id;
    		if(((Poster)producto).laminado != null)
    			productoDTO.laminadoId = ((Poster)producto).laminado.materialLaminado.id;
    		productoDTO.tipo=TipoProducto.POSTER.getValue();
    	}
    	else{
    		if(((Vinilo)producto).montaje != null)
    			productoDTO.montajeId = ((Vinilo)producto).montaje.materialMontaje.id;
    		productoDTO.tipo=TipoProducto.VINILO.getValue();
    	}
    	
    	productoDTO.precio=producto.calcularPrecio();
    	
    	return productoDTO;
    }
	
	public static Producto convert(ProductoDTO productoDTO){
    	ModelMapper modelMapper = new ModelMapper();
    	Producto producto=null;
		
		if(productoDTO.tipo.equals(TipoProducto.AFICHE.getValue())){
			producto=modelMapper.map(productoDTO, Afiche.class);
		}
		else if(productoDTO.tipo.equals(TipoProducto.BACKLIGHT.getValue())){
			producto=modelMapper.map(productoDTO, Backlight.class);
			if(productoDTO.terminacionId!=-1){
				Terminacion terminacion=new Terminacion();
				terminacion.especificacionTerminacion = EspecificacionTerminacion.findById(productoDTO.terminacionId);
				terminacion.save();
				((Backlight)producto).terminacion=terminacion;
			}
			
		}
		else if(productoDTO.tipo.equals(TipoProducto.BANNER.getValue())){
			producto=modelMapper.map(productoDTO, Banner.class);
			if(productoDTO.terminacionId!=-1){
				Terminacion terminacion=new Terminacion();
				terminacion.especificacionTerminacion= EspecificacionTerminacion.findById(productoDTO.terminacionId);
				terminacion.save();
				((Banner)producto).terminacion=terminacion;
			}
			if(productoDTO.portaBannerId!=-1){
				PortaBanner portaBanner=new PortaBanner();
				portaBanner.especificacionPortaBanner= EspecificacionPortaBanner.findById(productoDTO.portaBannerId);
				portaBanner.save();
				((Banner)producto).portaBanner=portaBanner;
			}
		}
		else if(productoDTO.tipo.equals(TipoProducto.DISPLAY.getValue())){
			producto=modelMapper.map(productoDTO, Display.class);
			
			if(productoDTO.terminacionId!=-1){
				Terminacion terminacion=new Terminacion();
				terminacion.especificacionTerminacion= EspecificacionTerminacion.findById(productoDTO.terminacionId);
				terminacion.save();
				((Display)producto).terminacion = terminacion;
			}
			if(productoDTO.montajeId!=-1){
				Montaje montaje = new Montaje();
				montaje.materialMontaje=MaterialMontaje.findById(productoDTO.montajeId);
				montaje.save();
				((Display)producto).montaje=montaje;
			}
		}
		else if(productoDTO.tipo.equals(TipoProducto.POSTER.getValue())){
			
			producto=modelMapper.map(productoDTO, Poster.class);
			if(productoDTO.terminacionId!=-1){
				Terminacion terminacion=new Terminacion();
				terminacion.especificacionTerminacion= EspecificacionTerminacion.findById(productoDTO.terminacionId);
				terminacion.save();
				((Poster)producto).terminacion = terminacion;
			}
			if(productoDTO.laminadoId!=-1){
			Laminado laminado =new Laminado();
			laminado.materialLaminado=MaterialLaminado.findById(productoDTO.laminadoId);
			laminado.save();
			((Poster)producto).laminado=laminado;
			}
		}
		else if(productoDTO.tipo.equals(TipoProducto.VINILO.getValue())){
			producto=modelMapper.map(productoDTO, Vinilo.class);
			if(productoDTO.montajeId!=-1){
			
				Montaje montaje = new Montaje();
				montaje.materialMontaje=MaterialMontaje.findById(productoDTO.montajeId);
				montaje.save();
				((Vinilo)producto).montaje=montaje;
			}
		}
		
		Impresion impresion=new Impresion();
		impresion.materialImpresion=MaterialImprimible.findById(productoDTO.impresionId);
		impresion.save();
		producto.impresion=impresion;
		
		producto.calidad = Calidad.findById(productoDTO.calidadId);
		
		return producto;
    }

}
